import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';

class CNMUtils {
  /// @description: 利用泛型，借助dart语言的函数引用，获取泛型实体类
  ///
  /// @json:        需要转模型的数据源
  ///
  /// @fromJson:    map转模型的函数
  ///
  /// @return Future<T>: 模型 Future
  static Future<T> getModel<T>(
    Map<String, dynamic> json, {
    required T Function(Map<String, dynamic>) fromJson,
  }) async {
    return fromJson(json);
  }

  /// 判断是否为空字符串
  ///
  /// return 空：true，非空：false
  ///
  static bool isBlank(String? value) {
    if (value == null) {
      return true;
    }
    if (value.isEmpty) {
      return true;
    }
    // 去除字符串空格
    String rsValue = value.replaceAll(RegExp(" "), "");
    if (rsValue.isEmpty) {
      return true;
    }
    return false;
  }

  /// 左边/右边补多少 0
  /// number：值
  ///
  /// count：补 0 的个数
  ///
  /// padLeft：是否左侧（默认 true）
  ///
  static String formatPadLeft(int number, {int count = 2, bool padLeft = true}) {
    if (padLeft) {
      return number.toString().padLeft(count, '0');
    }
    return number.toString().padRight(count, '0');
  }

  /// 保留小数点后 digits 位
  ///
  /// number: 值
  ///
  /// digits: 保留位数
  ///
  static double doubleFixed(
    double number, {
    int digits = 2,
  }) {
    return double.parse(number.toStringAsFixed(digits));
  }

  /// value: 文本内容；
  ///
  /// style : 文字样式；
  ///
  /// maxWidth：文本框的最大宽度 (double.infinity)；
  ///
  /// maxLines：文本支持最大多少行 (1)；
  ///
  static Size textSize(
    String value,
    TextStyle style, {
    double maxWidth = double.infinity,
    int maxLines = 1,
  }) {
    TextPainter painter = TextPainter(
      /// AUTO：华为手机如果不指定locale的时候，该方法算出来的文字高度是比系统计算偏小的。
      locale: WidgetsBinding.instance.platformDispatcher.locale,
      maxLines: maxLines,
      textDirection: TextDirection.ltr,
      //字体缩放大小
      text: TextSpan(
        text: value,
        style: style,
      ),
      ellipsis: maxLines == 1 ? '...' : null,
    );
    painter.layout(maxWidth: maxWidth);

    /// 文字的宽度: painter.width
    return painter.size;
  }

  /// 延时操作搜索
  ///
  /// doSomething；需要执行的代码
  ///
  static Timer? _timer;
  static void delayOperation(
    void Function() doSomething, {
    Duration duration = const Duration(milliseconds: 350),
  }) {
    if (_timer != null) {
      _timer!.cancel();
    }
    _timer = Timer(duration, () {
      doSomething.call();
      _timer = null;
    });
  }

  /// 将角度转换为弧度
  ///
  /// deg：角度
  ///
  static num degToRad(num deg) => deg * (pi / 180.0);
}
